using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Net;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.OData;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using server.status_db;
using EFCore.BulkExtensions;
using Microsoft.Extensions.Logging;
using System.Linq.Dynamic.Core;
using System.Dynamic;

[Authorize]
public class JsqtqkAController : ODataController
{
  private status_oneContext _db;
  readonly ILogger<AlfxsController> _log;
  public JsqtqkAController(status_oneContext context, ILogger<AlfxsController> log)
  {
    _db = context;
    _log = log;

  }
  private bool 教师其他情况AExists(Guid key)
  {
    return _db.JS_B_教师其他情况A.Any(p => p.ID == key);
  }
  [HttpPut]
  public async Task<IActionResult> Put([FromODataUri] Guid key, [FromBody]JS_B_教师其他情况A update)
  {
    try
    {
      if (!ModelState.IsValid)
      {

        var message = string.Join(" | ", ModelState.Values
                       .SelectMany(v => v.Errors)
                       .Select(e => e.Exception.Message));
        _log.LogError(this.User.Identity.Name + "," + message);
        return StatusCode(500, message);
      }
      if (key != update.ID)
      {
        return StatusCode(500, "key not eq id");
      }
      _db.Entry(update).State = EntityState.Modified;
      try
      {
        await _db.SaveChangesAsync();
      }
      catch (DbUpdateConcurrencyException e)
      {

        var message = "多用户不能同时修改同一条数据";
        _log.LogError(this.User.Identity.Name + "," + message);
        return StatusCode(500, message);

      }
      return Updated(update);
    }
    catch (Exception e)
    {
      _log.LogError(this.User.Identity.Name + "," + e.ToString());
      return StatusCode(500, e.Message.ToString());
    }
  }
  public async Task<IActionResult> Delete([FromODataUri] Guid key)
  {

    try
    {
      var mc = await _db.JS_B_教师其他情况A.FindAsync(key);
      if (mc == null)
      {
        var message = "没有发现要删除的对象Id";
        _log.LogError(this.User.Identity.Name + "," + message);
        return StatusCode(500, message);
      }
      _db.JS_B_教师其他情况A.Remove(mc);
      await _db.SaveChangesAsync();
      return NoContent();
    }
    catch (Exception e)
    {
      _log.LogError(this.User.Identity.Name + "," + e.ToString());
      return StatusCode(500, e.Message.ToString());
    }
  }
  [HttpPost]
  public async Task<IActionResult> Post([FromBody] JS_B_教师其他情况A model)
  {
    try
    {
      if (!ModelState.IsValid)
      {
        var message = string.Join(" | ", ModelState.Values
                        .SelectMany(v => v.Errors)
                        .Select(e => e.Exception.Message));
        return StatusCode(500, message);
      }
      _db.JS_B_教师其他情况A.Add(model);
      await _db.SaveChangesAsync();

      return Created(model);
    }
    catch (Exception e)
    {
      _log.LogError(this.User.Identity.Name + "," + e.ToString());
      return StatusCode(500, e.Message.ToString());
    }
  }
  [EnableQuery]
  public IActionResult Get()
  {
    try
    {
      return Ok(_db.JS_B_教师其他情况A);
    }
    catch (Exception e)
    {
      _log.LogError(this.User.Identity.Name + "," + e.ToString());
      return StatusCode(500, e.Message.ToString());
    }
  }
  //
  [HttpPost]
  public IActionResult BulkAddJsqtqkA(ODataActionParameters parameters)
  {

    var JsqtqkA = (IEnumerable<JS_B_教师其他情况A>)parameters["JsqtqkA"];
    //

    _db.BulkInsert<JS_B_教师其他情况A>(new List<JS_B_教师其他情况A>(JsqtqkA));
    // Your data access layer logic goes here.
    return this.Ok(HttpStatusCode.NoContent);
  }
 [HttpGet("/api/JsqtqkA/AuditAllData")]
    public IActionResult AuditAllData(String GH,String XM,String status,String XXID, String CJPC)
    {
        
        _db.Database.ExecuteSqlCommand($"update JS_B_教师其他情况A set 审核卡号={GH},审核姓名={XM},审核状态={status},审核时间= GETDATE() where XXID={XXID} and CJPC={CJPC}");
         return NoContent();
    }
  [HttpGet("/api/JsqtqkA/RemoveAllData")]
   public IActionResult RemoveAllData(String GH,String XM,String XXID, String CJPC){
         _db.Database.ExecuteSqlCommand($"update JS_B_教师其他情况A set 删除卡号={GH},删除姓名={XM},是否删除=1,删除时间= GETDATE() where XXID={XXID}  and  CJPC={CJPC}");
         return NoContent();
    }
  [HttpGet("/api/JsqtqkA/GetData")]
  public IActionResult GetData(String XXID, String CJPC, String query, string order, int limit, int skip, String viewMode)
  {
    //
    Console.WriteLine("query " + query);
    //

    var datas = _db.JS_B_教师其他情况A.Where("XXID == @0 and CJPC == @1 and (是否删除 ==0 or 是否删除 == null)", XXID, CJPC);
    if (viewMode == "是")
      datas = datas.Where("审核状态 ==\"通过\"");
    if (query != null)
      datas = datas.Where(query);



    var sums = new String[20];


    sums[0] = "合计";
    sums[6] = "教师数:" + datas.Select(e => e.GH).Distinct().Count();
    sums[7] = "项目数:" + datas.Select(e => e.PXJX_XMMC != null).Count();
    sums[8] = "平均:" + datas.Select(e => e.PXJX_SJ).Average();
    sums[4] = "通过:" + datas.Where(e => e.审核状态 == "通过").Count();
    sums[4] += ",不通过:" + datas.Where(e => e.审核状态 == "不通过").Count();
    sums[4] += ",待审核:" + datas.Where(e => e.审核状态 == "待审x`核").Count();
    dynamic temp = new ExpandoObject();
    temp.sums = sums;
    temp.total = datas.Count();
    temp.values = datas.OrderBy(order).Skip(skip).Take(limit).ToArray();

    return this.Ok(temp);
  }
}